#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
# @version: v1.0
# @author : wlisingle
# @Email : 19688513@qq.com
# @Project : trade-smart
# @File : scheduled_stock_tasks.py
# @Software: PyCharm
# @time: 2025/4/9 9:36
# @description : 定时任务调度器，用于管理股票数据、交易日期和历史数据的获取与更新
"""

import logging
from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger

from history_data.stock_history_data_manager import StockHistoryDataManager
from stock_data.stock_data_manager import StockDataManager
from trade_date.trade_date_manager import TradeDateManager


class ScheduledStockTasks:
    def __init__(self, task_config):
        """
        初始化调度类，加载任务配置。
        :param task_config: 字典格式的任务时间配置，例如：
            {
                'stock_data': {'hour': 9, 'minute': 0},
                'trade_dates': {'day_of_week': 'mon', 'hour': 8, 'minute': 0},
                'history_data': {'hour': 23, 'minute': 0}
            }
        """
        self.stock_data_manager = StockDataManager()
        self.trade_calendar = TradeDateManager()
        self.history_collector = StockHistoryDataManager()
        self.scheduler = BackgroundScheduler()
        self.task_config = task_config
        self._setup_schedulers()

    def _setup_schedulers(self):
        """根据配置添加定时任务"""
        # 股票数据任务
        if 'stock_data' in self.task_config:
            trigger = CronTrigger(
                hour=self.task_config['stock_data']['hour'],
                minute=self.task_config['stock_data']['minute']
            )
            self.scheduler.add_job(
                self.run_stock_data_task,
                trigger=trigger,
                name='Stock Data Update'
            )
            logging.info("已设置股票数据更新任务。")

        # 交易日数据任务
        if 'trade_dates' in self.task_config:
            trigger = CronTrigger(
                hour=self.task_config['trade_dates']['hour'],
                minute=self.task_config['trade_dates']['minute']
            )
            self.scheduler.add_job(
                self.run_trade_dates_task,
                trigger=trigger,
                name='Trade Dates Update'
            )
            logging.info("已设置交易日期更新任务。")

        # 历史数据任务
        if 'history_data' in self.task_config:
            trigger = CronTrigger(
                hour=self.task_config['history_data']['hour'],
                minute=self.task_config['history_data']['minute']
            )
            self.scheduler.add_job(
                self.run_history_data_task,
                trigger=trigger,
                name='History Data Maintenance'
            )
            logging.info("已设置历史数据维护任务。")

    def run_stock_data_task(self):
        """执行股票数据获取和日志任务"""
        try:
            logging.info("删除旧数据...")
            self.stock_data_manager.delete_database()  # 删除旧数据
            logging.info("创建旧数据...")
            self.stock_data_manager.create_database()
            logging.info("开始获取股票数据...")
            self.stock_data_manager.fetch_stock_data()  # 获取新数据

        except Exception as e:
            logging.error(f"股票数据任务失败: {str(e)}")

    def run_trade_dates_task(self):
        """执行交易日数据更新和测试"""
        try:
            logging.info("删除旧交易日数据...")
            self.trade_calendar.delete_database()  # 删除旧交易日数据
            logging.info("创建交易日数据...")
            self.trade_calendar.create_database()
            logging.info("更新交易日数据...")
            self.trade_calendar.fetch_and_store_trade_dates()  # 获取并存储新交易日数据

        except Exception as e:
            logging.error(f"交易日任务失败: {str(e)}")

    def run_history_data_task(self):
        """执行历史数据收集和维护"""
        try:
            logging.info("删除旧历史数据...")
            self.history_collector.delete_database()  # 删除旧历史数据
            logging.info("创建历史数据...")
            self.history_collector.create_database()  # 删除旧历史数据
            logging.info("配置SQLite数据库参数以优化性能...")
            self.history_collector.configure_database()  # 删除旧历史数据
            logging.info("开始收集历史数据...")
            self.history_collector.fetch_combined_data()  # 获取新的历史数据
        except Exception as e:
            logging.error(f"历史数据任务失败: {str(e)}")

    def start(self):
        """启动所有定时任务"""
        self.scheduler.start()
        logging.info("定时任务调度器已启动")

    def stop(self):
        """停止所有定时任务"""
        self.scheduler.shutdown()
        logging.info("定时任务调度器已停止")


if __name__ == "__main__":
    # 配置任务执行时间（示例：每天19点、每周一8点、每天21点）
    task_config = {
        'trade_dates': {'hour': 11, 'minute': 0},
        'stock_data': {'hour': 11, 'minute': 10},
        'history_data': {'hour': 14, 'minute': 10}
    }

    # 初始化并启动任务
    scheduler = ScheduledStockTasks(task_config)
    scheduler.start()

    # 保持主线程运行（若在后台服务中可移除以下代码）
    try:
        while True:
            pass
    except KeyboardInterrupt:
        scheduler.stop()
